﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using ModelLayer;
using System.Collections.Generic;

namespace AssessmentTool.PresentationLogic
{
    public class UtenteTrackingHelper
    {

        public static void pulisciUtente(Boolean acceptChanges)
        {
            Utente u = (Utente)Session.getInstance().getValue("USER");
            if(acceptChanges)
                u.AcceptChanges();

            Risposta[] listaRisp = new Risposta[u.Risposte.Count];
            u.Risposte.CopyTo(listaRisp, 0);
            foreach (Risposta risp in listaRisp)
            {
                if (acceptChanges)
                {
                    risp.AcceptChanges();
                    risp.AnagraficaPesi.AcceptChanges();
                    risp.Sessione.AcceptChanges();
                }
                risp.StopTracking();
                u.StopTracking();
                u.Sessioni[0].StopTracking();
                u.Risposte.Remove(risp);
                risp.Sessione.Risposte.Remove(risp);
                u.Sessioni[0].StartTracking();
                risp.StartTracking();
                u.StartTracking();
            }
        }
        
        /* Mi creo una anagrafica pesi copia che non contiene l'albero delle competenze cosi da minimizzare i dati passati al server in fase di salvataggio */
        /*
        public static AnagraficaPesi detachedAnagraficaPesi(AnagraficaPesi orig)
        {
            AnagraficaPesi ap = new AnagraficaPesi() { Id = orig.Id }.MarkAsUnchanged();
            return ap;
        }
        */
        /* Mi creo una anagrafica pesi  che non contiene l'albero delle competenze cosi da minimizzare i dati passati al server in fase di salvataggio. Questi vanno salvati cosi che modifiche successive utilizzano sempre la stessa istanza e
         * permettono l'opportuno funzionamento degli original values */

        public static List<AnagraficaPesi> detachedAnagraficaPesi(List<AnagraficaPesi> orig)
        {
            List<AnagraficaPesi> pesi = new List<AnagraficaPesi>();
            
            foreach (AnagraficaPesi peso in orig)
            {
                AnagraficaPesi ap = new AnagraficaPesi() { Id = peso.Id }.MarkAsUnchanged();
                pesi.Add(ap);
            }
            return pesi;
        }

        /* Mi creo una risposta copia che non contiene l'albero delle competenze cosi da minimizzare i dati passati al server in fase di salvataggio */


        public static Risposta detachedRisposta(Risposta orig, Utente ut, AnagraficaPesi pesiDetached)
        {
            Risposta rnew = new Risposta() { Id = orig.Id }.MarkAsUnchanged();

            //ut.StopTracking();
            rnew.StopTracking();
            //rnew.Utente = ut;
            
            pesiDetached.StopTracking();
            rnew.StopTracking();
            rnew.AnagraficaPesi = pesiDetached;
            // ut.StartTracking();
            rnew.StartTracking();

            return rnew;
        }

        public static Risposta getNuovaRisposta(Utente utente, ModelLayer.Competenza competenza)
        {
            Risposta risposta = new Risposta();
            risposta.Id = utente.Username + competenza.Codice;
            risposta.StartTracking();
            risposta.Utente = utente;
            risposta.Sessione = utente.Sessioni[0];
            return risposta;
        }

        public static void associaUtenteRisposta(Utente utente, Risposta risposta)
        {
            if (utente.Risposte.Contains(risposta))
                return;
            utente.StopTracking();
            risposta.StopTracking();
            utente.Sessioni[0].StopTracking();
            risposta.Utente = utente;
            risposta.Sessione = utente.Sessioni[0];
            utente.Sessioni[0].StartTracking();
            risposta.StartTracking();
            utente.StartTracking();
        }
    }
}
